查看原文
其他

【爬虫+可视化】租房难?pandas_bokeh助你快速筛选!

爬虫俱乐部 Stata and Python数据分析 2023-10-24

本文作者:温和铭 中南财经政法大学统计与数学学院

本文编辑:何   疆

技术总编:金   点







Stata and Python 数据分析

爬虫俱乐部Stata基础课程Stata进阶课程Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~

一年一度的秋招大战已经吹响号角,想必大多数毕业生正在为找到一份心仪的工作而努力准备,笔者先在此祝各位offer多多!然而,找到工作并不意味着就可以马上“躺平”,不是每家公司都有“包住宿”的福利,因此,找房也就成了许多毕业生进入社会之后的头等大事。

“年轻人的第一次崩溃从租房开始”不是说说而已,租房需要考虑的因素可不少,租金、基础设施、通勤时长、小区环境、房东人品等都会影响租房的体验感,如何找到合适的房源是一项不小的课题,借助Python可以大大减轻我们的工作量。本文将以链家网为例,爬取武汉地区的租房信息,并使用pandas_bokeh库在地图上标注,方便大家定位房源。话不多说,马上开始!

一、爬取租房信息


首先,进入武汉链家网(https://wh.lianjia.com/),选择右上角菜单中的“租房”,进入我们需要爬取数据的具体页面。

在租房页面中,通过切换页码,可以发现网页链接的规律,第n页对应的页面编码为pg{n},由此构建url。

url = 'https://wh.lianjia.com/zufang/' + 'pg' + str(i) + '/' + '#contentList'

其次,查看页面中需要爬取的内容,使用右键检查功能定位到具体的标签。以标题信息为例,其对应的class为'twoline',因此,使用BeautifulSoup找到所有class为'twoline'的元素,并提取它们的文本内容。

然后将提取的文本内容进行去除首尾空格的处理,并将结果存储在一个名为rent_title的列表中。其余的页面信息爬取思路与之类似。在此我们分别爬取了房源信息标题rent_title、房源描述rent_des和房租rent_price,本次只爬取前10页的内容作为例子,代码及结果如下:

import pandas as pdimport jsonimport requestsfrom bs4 import BeautifulSoupimport re,sysfrom fake_useragent import UserAgentimport importlibimportlib.reload(sys)
BASE_URL = 'https://wh.lianjia.com/zufang/'# 页面数PAGE_SIZE = 10# 定义函数构造每一页内容urldef creat_conttentList_html(i): url = BASE_URL + 'pg' + str(i) + '/' + '#contentList' return url
# 访问url 发送请求def get_html(url): # 请求头 用来伪装浏览器请求 headers = { 'Cookie': '用户自己的cookie', 'Referer': 'https://wh.lianjia.com/zufang/', "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203" } # 发送请求 response = requests.get(url=url,headers=headers) if response.status_code ==200: # 返回响应内容 html = response.text print(html) return html else: print("网页出现错误")
data = []# 定义函数用bs4解析提取数据def extract_info(html): # bs4解析网页 soup = BeautifulSoup(html, 'html.parser') # 提取标题 rent_title = [item.get_text().strip() for item in soup.find_all(class_='twoline')] # print(rent_title) # print(len(rent_title)) # 提取描述信息 rent_des = [item.get_text().strip().replace("/", "").replace(" ", "") for item in soup.find_all('p', class_='content__list--item--des')] # print(rent_des) # print(len(rent_des)) # 租金价格 rent_price = [item.get_text().strip() for item in soup.find_all('span', class_="content__list--item-price")] # print(rent_price) # print(len(rent_price)) for i in range(len(rent_price)): data.append([rent_title[i],rent_des[i],rent_price[i]]) return data # 保存数据def save_data(data): columns = ['rent_title','rent_des','rent_price'] df = pd.DataFrame(data,columns=columns) # 将数据保存到excel中 df.to_excel('武汉租房.xlsx',encoding='utf-8') # 运行主程序if __name__=='__main__': # 循环遍历 获取10页数据 for i in range(1,PAGE_SIZE+1): url = creat_conttentList_html(i) html = get_html(url) extract_info(html) save_data(data) print("正在抓取第{}页".format(i))

二、获取房源经纬度


在初步爬取获得的数据中,rent_des一列中的信息包含了地址、房屋面积、朝向、户型和楼层数等信息,通过数据清洗(具体步骤可在后台留言索取),将数据分列,得到地址rent_address、面积rent_area、朝向rent_orien、户型rent_room、层级rent_level、层数rent_floor几列信息,结果如下:

接着,我们调用高德API,使用其中的地理编码功能,根据房屋地址rent_address获取经纬度,代码和结果如下:

import pandas as pdimport requestsimport timeimport csvimport json def gaode(addr): para = { 'key':'用户自己的key', #高德地图开放平台申请的key 'address':addr #传入地址参数 } url = 'https://restapi.amap.com/v3/geocode/geo?' #高德地图API接口 req = requests.get(url,para) req = req.json() print('-' * 30) m = req['geocodes'][0]['location'] print(m) return m#gaode(addr="武汉")
df2 = pd.read_excel('武汉租房.xlsx') #读取地址数据time_start = time.time()df2['经纬度'] = df2['rent_address'].apply(gaode) #调用函数time_end = time.time()t = time_end-time_startprint('共用时%s秒'%t)# 将数据保存到excel中df2.to_excel('武汉租房经纬度.xlsx',encoding='utf-8')

三、数据可视化


获得了经纬度,我们就可以开始绘制地图了。本次数据可视化使用到的库为pandas_bokeh。首先我们简单了解一下Bokeh库,这是一个交互式可视化库,与之前介绍的Altair库Python交互式数据可视化——酷炫的Altair库功能类似,但是Altair库在处理超过5000个以上样本的数据集时,需要先对数据进行汇总,并且缺乏一些可选的样式,具有一定的局限性。相比之下,Bokeh库拥有更加灵活的制图选项,能够创建功能更丰富、效果更美观的图片。pandas_bokeh则是在Bokeh库的基础上,增添了直接与pandas库的连接,使得从数据集到图表的代码更加简洁流畅,库的安装、调用与基本语法如下:

pip install pandas-bokehimport pandas as pdimport pandas_bokehdf.plot_bokeh(kind="图形类型") df.plot_bokeh.图形类型(...) #另一种绘图语法#图形类型可选line、point、step、scatter、bar、hist、area、pie、map

目前pandas_bokeh库支持绘制线型图、直方图、散点图、饼图和地图等八种类型的图形,感兴趣的朋友可以进入官方文档查看详细的介绍(GitHub - PatrikHlobil/Pandas-Bokeh: Bokeh Plotting Backend for Pandas and GeoPandas)。

接下来,我们以绘制地图为例,展示pandas_bokeh强大的交互式可视化功能。我们希望得到的效果是在地图上标注出各个房源的地点,具体地,使用经纬度与地图上的位置进行匹配,并用散点标记,点的大小表示房屋的面积rent_area,颜色表示楼层高度等级rent_level,房屋的户型、租金和楼层数在点的标签里进行展示。

# 导入工具包import pandas_bokehimport pandas as pdimport numpy as npimport math
# 读取数据data = pd.read_excel('C:/Users/wenhe/Desktop/Bokeh数据可视化/武汉租房经纬度.xlsx',index_col=0)
# 创建新变量data["size"] = data["rent_area"] / 10
# 作图#在notebook中显示可视化结果pandas_bokeh.output_notebook()data.plot_bokeh.map(x="lon", y="lat", hovertool_string="""<h2> @{rent_title} </h2> <h3> 价格: @{rent_price} </h3> <h4> 楼层: @{rent_floor} </h4> """, tile_provider="STAMEN_TERRAIN_RETINA", size="size", category="rent_level1", colormap="Viridis", figsize=(1000, 600), title="武汉租房房源分布")

此外,我们也可以将交互式图像导出为html格式,方便随时调取查看,注意,以下代码需要在画图命令之前执行。

#导出交互式图片pandas_bokeh.output_file("武汉租房信息.html")

在jupyter notebook中的展示结果如下,我们可以滑动鼠标进行区域的放缩,也可以将鼠标移动至感兴趣的位置,查看对应的房源信息,这样房屋的地理位置、周围环境等信息就一览无余,对于重点考虑通勤和居住环境的求租者而言,相比点开网页中的房屋地址一条条比对,无疑方便了不少~

以上就是本次Python实战的全部内容,正在找房的你可以开始动手试试啦~最后祝各位租房人都能顺利找到“梦中情房”!

END


重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!











往期推文推荐招聘全面启动,你找到适合自己的工作了吗?
“狗大户”疯狂投币!中东基金加速布局A股【python可视化】立秋!酷热天气就此结束?全国各地高温地图一探究竟Python爬取暑期票房排行
给文件搬家——copy&XCOPY
NLTK,全面的Python基础NLP库
爬取A股上市公司指定年份年报
机器学习——监督学习入门‍‍禁忌魔法解封,击穿专业壁垒:ChatGPT code interpreter暑期来啦~⼀起看⼀看近期的天⽓情况【命令重磅更新】在Stata中深入使用ChatGPT
爬虫俱乐部2023第一期编程训练营开始报名啦!
【爬虫基础】Scrapy爬虫框架迈向交互式编程,ChatGPT更新!一个简单又好玩的Python库——MyQR
replace命令的“加强版”!——如何使用ereplace,结合egen
XML 轻松读取:用 Python 发现数据宝藏

爬虫俱乐部重磅推出cnstata.com.cn

Markdown:让数学公式输入更方便!

处理日期的好手:pendulum     关于我们 

   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存